<?php

/** 
 * Classe de modelo do estoque
 * @author felipe
 *  
 * 
 */
class App_Model_EstoqueMapper{
	
	/**
	 * Metodo que busca a quantidade do produto disponivel
	 * 
	 * @param 	App_Model_Estoque
	 * @throws  Voitech_Exception
	 * @return  void
	 */
	public function buscarQuantidadeProdutoDisponivel(App_Model_Estoque $obEstoque) {
		if( !isset( $obEstoque->getObProduto()->getCoProduto() ) ) {
			throw new Voitech_Exception('Favor enviar o produto desejado');
		}
		$objSelect = App_Model_Db_Armazenagem::build()->select()
														 ->distinct()
														 ->columns(array('total_produto'=>new Zend_Db_Expr('count(co_produto)')))
														 ->where('co_produto = ?',$obEstoque->getObProduto()->getCoProduto())
														 ->where('co_distribuicao is null');
		$arrDbEstoque = App_Model_Db_Armazenagem::build()->getAdapter()
		                                                    ->fetchAll($objSelect);		                                                    
		if( empty( $arrDbEstoque ) ) {
			throw new Voitech_Exception('Produto n&atilde;o disponivel');
		}
		$obEstoque->setNuQuantidadeProdutoDisponivel($arrDbEstoque->total_produto);
		return $obEstoque;	
	}
	
	/**
	 * Faz uma transação de entrada de produto
	 * 
	 * @param App_Model_Estoque $obEstoque
	 * @throws Voitech_Exception
	 * @return void
	 */
	public function transacaoEntrada(App_Model_Estoque $obEstoque) {
		if( $obEstoque->getObCompra() == null )
		{
			throw new Voitech_Exception('Favor enviar os dados da compra');
		}
			
		$arItemCompra = $obEstoque->getObCompra()->getArrItemCompra();
		foreach( $arItemCompra as $obItemCompra ) {			
			$intQtProduto = $obItemCompra->getNuQuantidadeProduto();						
			for($x=0;$x < $intQtProduto;$x++) {				
				App_Model_Db_Armazenagem::build()->insert(array('co_compra'=>$obEstoque->getObCompra()->getCoCompra()
				                                               ,'co_produto'=>$obItemCompra->getObProduto()
				                                                                           ->getCoProduto()));
			}
		}
	}
	
	/**
	 * Metodo que faz a transação de saida de produto do estoque
	 * @param App_Model_Estoque $obEstoque
	 * @return void
	 */
	public function transacaoSaida(App_Model_Estoque $obEstoque) {	
		if( $obEstoque->getObDistribuicao() == null )
		{
			throw new Voitech_Exception('Favor enviar os dados da compra');
		}			
		$arItemDistribuicao = $obEstoque->getObDistribuicao()->getArrItemDistribuicao();
		foreach( $arItemDistribuicao as $obItemDistribuicao ) {
			$intQtProduto = $obItemDistribuicao->getNuQuantidadeAtendida();
			if( $intQtProduto > $this->buscarQuantidadeProdutoDisponivel($obItemCompra->getObProduto())->nuQuantidadeProdutoDisponivel )
			{
				throw new Voitech_Exception('Quantidade de produtos( '.$obItemCompra->getObProduto()->getNoProduto().' ) maior que a disponivel');
			}
			for($x=0;$x < $intQtProduto;$x++) {				
				$rowArmazenagem = App_Model_Db_Armazenagem::build()->fetchRow('co_produto = '.$obItemCompra->getObProduto()
				                                                                            ->getCoProduto() 
				                                                            . ' and co_distribuicao is null');
				$rowArmazenagem->co_distribuicao = $obDistribuicao->getCoDistribuicao();
				$rowArmazenagem->save();
			}
		}
	}
}